Hi Severus,
danke für die Antwort erst Mal.
Natürlich ist mir klar, dass dies mit Memberfunktion geht. Trifft jedoch nicht meinen Anwendungsfall.
Habe Objekte verschiedener Klassen, bei denen in Abhängigkeit des Kontexts verschiedene Membervariablen verschiedener Typen gesetzt werden sollen.
Die Funktion, die den Wert setzt, bekommt nicht das Objekt sondern die zu ändernde Variable übergeben. Dies kann ggf. auch eine lokale oder globale Variable sein.
Zudem kann nicht davon ausgegangen werden, dass für die Membervariablen jeweils eine Memberfunktion zum Setzen implementiert ist. Und falls implementiert, wäre der Name der Memberfunktion und der Typ des Parameters unterschiedlich.
Somit scheidet die Lösung über Memberfunktionen aus.
Habe inzwischen allerdings eine Lösung mittels einer allgemeinen Funktion zum Setzen von Variablen gefunden. Bei Membervariablen arbeitet diese über Let-/Set-Property Aufrufe.
Meine Funktion zum kontextbezogenen Setzen der Variablen bekommt nun als zusätzlichen Parameter den Namen der Membervariablen als String bzw. einen leeren String bei lokalen oder globalen Variablen.
Falls jemand in die Lage kommt, so etwas bzw. eine universelle Funktion zum Setzen von Variablen zu brauchen, hier mal der Sourcecode (leider wahrscheinlich wieder ohne Einrückungen, weil die Forumsoftware ja für gewöhnlich alles rausschmeißt):
Im Klassenmodul der Testklasse 'cTest':
---
Public vTest as Variant
---
Im Modul für meine allgemeinen Funktionen 'gCommon':
---
Public Function mbSet( _
ByRef pvTarget As Variant, ByRef psTarget As Variant, _
ByVal pvSource As Variant) As Boolean
On Error GoTo Error1
If psTarget = "" Then
If IsObject(pvSource) Then
Set pvTarget = pvSource
Else
Let pvTarget = pvSource
End If
Else
If IsObject(pvSource) Then
Call CallByName(pvTarget, psTarget, VbSet, pvSource)
Else
Call CallByName(pvTarget, psTarget, VbLet, pvSource)
End If
End If
Let mbSet = True
Exit Function
Error1:
Let mbSet = False
End Function
---
und zum Test im Modul 'gTest':
---
Public vTest as Variant
Public Sub mTest()
Dim tvTest As Variant
Set tvTest = New cTest
Debug.Print
Call mPrintSet("tvTest", tvTest, "vTest", "member")
Call mPrintSet("tvTest", tvTest, "vTest", New Collection)
Call mPrintSet("tvTest", tvTest, "vTest", Array(0, 1, 2, 3))
Call mPrintSet("tvTest", tvTest, "vTest", 1.23)
Call mPrintSet("tvTest", tvTest, "", "local")
Call mPrintSet("tvTest", tvTest, "", New Collection)
Call mPrintSet("gTest.tvTest", gTest.vTest, "", "global")
Call mPrintSet("gTest.tvTest", gTest.vTest, "", Now())
Debug.Print
End Sub
Public Sub mPrintSet(ByRef psLabel As String, _
ByRef pvTarget As Variant, ByRef psTarget As Variant, _
ByRef pvSource As Variant)
Dim tbSet As Boolean
Let tbSet = gCommon.mbSet(pvTarget, psTarget, pvSource)
Debug.Print "gCommon.mbSet(" _
& psLabel & ", " & Chr(34) & psTarget & Chr(34) & ", " _
& msValue(pvSource) & ") _" & vbCrLf _
& " = " & tbSet
If psTarget = "" Then
Debug.Print psLabel & " = " & msValue(pvTarget)
Else
Debug.Print psLabel & "." & psTarget & " = " _
& msValue(CallByName(pvTarget, psTarget, VbGet))
End If
End Sub
Public Function msValue(ByRef pvVariable As Variant) As String
Let msValue = TypeName(pvVariable)
If IsObject(pvVariable) Then
Exit Function
End If
If IsArray(pvVariable) Then
Let msValue = Left(msValue, Len(msValue) - 2) _
& "(" & LBound(pvVariable)_
& " To " & UBound(pvVariable) & ")"
Exit Function
End If
If VarType(pvVariable) = vbString Then
Let msValue = Chr(34) & pvVariable & Chr(34)
Exit Function
End If
If VarType(pvVariable) = vbDate Then
Let msValue = "#" & pvVariable & "#"
Exit Function
End If
Let msValue = CStr(pvVariable)
If IsNumeric(msValue) Then
Let msValue = Replace(msValue, ",", ".")
End If
End Function
---
Gruß,
carpetemporem
|